﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using TccServicos.Models;
using TccServicos.Util;

namespace TccServicos.Controllers
{
    public class AnimalDoadoRecolhidoController : ApiController
    {
        #region Atributos
        private string sThread = "";
        #endregion

        #region WebApis do TCC Animal DoadoRecohido
        [HttpPost]
        public RetornoServico SaveDoadoRecolhido(Animal animal)
        {
            sThread = Util.Util.NextHex(4);
            string nomeFuncao = string.Format("{0} [{1}]", "SaveDoadoRecolhido", sThread);

            try
            {
                if (!Validacao.ObjetoValido(animal))
                {
                    Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.objetoInvalido));
                }

                string jsonEntrada = JsonConvert.SerializeObject(animal, new JsonSerializerSettings()
                {
                    NullValueHandling = NullValueHandling.Ignore
                });

                Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, jsonEntrada));

                using (adoteEntities contexto = new adoteEntities())
                {
                    if (animal.animalTipo.Equals(AnimalTipo.Doacao))
                    {
                        if (animal.DoadoRecolhido.HasValue)
                        {
                            var resultado = (from t in contexto.CADASTRO_ANIMAL.AsNoTracking()
                                             where t.ID_CADASTRO_ANIMAL == animal.id
                                             select t).FirstOrDefault();
                            if (resultado != null)
                            { 
                                resultado.DOADO = animal.DoadoRecolhido;
                                contexto.CADASTRO_ANIMAL.Attach(resultado);
                                contexto.Entry(resultado).State = System.Data.EntityState.Modified;
                                contexto.SaveChanges();
                            }
                            else
                            {
                                return Util.Util.RetornoErro("Animal não encontrado");
                            }
                        }
                        else
                        {
                            return Util.Util.RetornoErro("Operação não realizada");
                        }
                    }
                    else
                    {
                        if (animal.DoadoRecolhido.HasValue)
                        {
                            var resultado = (from t in contexto.CADASTRO_ANIMAL_ABANDONADO.AsNoTracking()
                                             where t.ID_CADASTRO_ABANDONADO == animal.id
                                             select t).FirstOrDefault();
                            if (resultado != null)
                            {
                                resultado.RECOLHIDO = animal.DoadoRecolhido;
                                contexto.CADASTRO_ANIMAL_ABANDONADO.Attach(resultado);
                                contexto.Entry(resultado).State = System.Data.EntityState.Modified;
                                contexto.SaveChanges();
                            }
                            else
                            {
                                return Util.Util.RetornoErro("Animal não encontrado");
                            }
                        }
                        else
                        {
                            return Util.Util.RetornoErro("Operação não realizada");
                        }
                    }

                    Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.salvoComSucesso));
                    return Util.Util.RetornoOk();
                }
            }
            catch (Exception ex)
            {
                Log.GravarLog(string.Format("{0} Erro: {1}", nomeFuncao, ex.ToString()));
                return Util.Util.RetornoErro(ex.ToString());
            }
        }
        #endregion
    }
}
